// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cc/resources/shared_bitmap.h"

#include <stddef.h>
#include <stdint.h>

#include "base/logging.h"
#include "base/numerics/safe_math.h"
#include "base/rand_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"

namespace cc {

SharedBitmap::SharedBitmap(uint8_t* pixels, const SharedBitmapId& id)
    : pixels_(pixels)
    , id_(id)
{
}

SharedBitmap::~SharedBitmap()
{
}

// static
bool SharedBitmap::SizeInBytes(const gfx::Size& size, size_t* size_in_bytes)
{
    if (size.IsEmpty())
        return false;
    base::CheckedNumeric<size_t> s = 4;
    s *= size.width();
    s *= size.height();
    if (!s.IsValid())
        return false;
    *size_in_bytes = s.ValueOrDie();
    return true;
}

// static
size_t SharedBitmap::CheckedSizeInBytes(const gfx::Size& size)
{
    CHECK(!size.IsEmpty());
    base::CheckedNumeric<size_t> s = 4;
    s *= size.width();
    s *= size.height();
    return s.ValueOrDie();
}

// static
size_t SharedBitmap::UncheckedSizeInBytes(const gfx::Size& size)
{
    DCHECK(VerifySizeInBytes(size));
    size_t s = 4;
    s *= size.width();
    s *= size.height();
    return s;
}

// static
bool SharedBitmap::VerifySizeInBytes(const gfx::Size& size)
{
    if (size.IsEmpty())
        return false;
    base::CheckedNumeric<size_t> s = 4;
    s *= size.width();
    s *= size.height();
    return s.IsValid();
}

// static
SharedBitmapId SharedBitmap::GenerateId()
{
    SharedBitmapId id;
    // Needs cryptographically-secure random numbers.
    base::RandBytes(id.name, sizeof(id.name));
    return id;
}

base::trace_event::MemoryAllocatorDumpGuid GetSharedBitmapGUIDForTracing(
    const SharedBitmapId& bitmap_id)
{
    auto bitmap_id_hex = base::HexEncode(bitmap_id.name, sizeof(bitmap_id.name));
    return base::trace_event::MemoryAllocatorDumpGuid(
        base::StringPrintf("sharedbitmap-x-process/%s", bitmap_id_hex.c_str()));
}

} // namespace cc
